jQuery.fn.calendarPicker = function(options) {
	// --------------------------  start default option values --------------------------
	if (!options.date) {
		options.date = new Date();
	}
	if (typeof(options.years) == "undefined")
		options.years=0;
	if (typeof(options.months) == "undefined")
		options.months=0;
	if (typeof(options.days) == "undefined")
		options.days=4;
	if (typeof(options.showDayArrows) == "undefined")
		options.showDayArrows=true;
	if (typeof(options.useWheel) == "undefined")
		options.useWheel=true;
	if (typeof(options.callbackDelay) == "undefined")
		options.callbackDelay=500;
	if (typeof(options.monthNames) == "undefined")
		options.monthNames = ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"];
	if (typeof(options.dayNames) == "undefined")
		options.dayNames = ["Chủ nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy"];
	// --------------------------  end default option values --------------------------
	var calendar = {currentDate: options.date};
	calendar.options = options;
	//build the calendar on the first element in the set of matched elements.
	var theDiv = this.eq(0);//$(this);
	theDiv.addClass("calBox");
	//empty the div
	theDiv.empty();
	var divYears = $("<span>").addClass("calYear");
	var divMonths = $("<span>").addClass("calMonth");
	var divDays = $("<div>").addClass("calDay");
	var divTitles = $("<h4>").addClass("");
	divTitles.append(divMonths).append('<span> - </span>').append(divYears);
	theDiv.append(divTitles).append(divDays);
	calendar.changeDate = function(date) {
		calendar.currentDate = date;
		var fillYears = function(date) {
			var year = date.getFullYear();
			var t = new Date();
			divYears.empty();
			var nc = options.years*2+1;
			for (var i = year - options.years; i <= year + options.years; i++) {
				var d = new Date(date);
				d.setFullYear(i);
				divYears.addClass("calElement").attr("millis", d.getTime()).html(i);
				if (d.getYear() == t.getYear())
					divYears.addClass("today");
				if (d.getYear() == calendar.currentDate.getYear())
					divYears.addClass("selected");
			}
		}
		var fillMonths = function(date) {
			var month = date.getMonth();
			var t = new Date();
			divMonths.empty();
			var oldday = date.getDay();
			var nc = options.months*2+1;
			for (var i = -options.months; i <= options.months; i++) {
				var d = new Date(date);
				var oldday = d.getDate();
				d.setMonth(month + i);
				
				if (d.getDate() != oldday) {
					d.setMonth(d.getMonth() - 1);
					d.setDate(28);
				}
				divMonths.addClass("calElement").attr("millis", d.getTime()).html(options.monthNames[d.getMonth()]);
				if (d.getYear() == t.getYear() && d.getMonth() == t.getMonth())
					divMonths.addClass("today");
				if (d.getYear() == calendar.currentDate.getYear() && d.getMonth() == calendar.currentDate.getMonth())
					divMonths.addClass("selected");
			}
		}
		var fillDays = function(date) {
			var day = date.getDate();
			var t = new Date();
			divDays.empty();
			var nc = options.days*2+1;
			var w = parseInt((theDiv.width()-4-(options.showDayArrows?12:0)-(nc)*4)/(nc-(options.showDayArrows?2:0)))+"px";
			for (var i = -options.days; i <= options.days; i++) {
				var d = new Date(date);
				d.setDate(day + i)
				var span = $("<span>").addClass("calElement").attr("millis", d.getTime())
				if (i == -options.days && options.showDayArrows) {
					span.addClass("prev glyphicon glyphicon-chevron-left").html("");
				} else if (i == options.days && options.showDayArrows) {
					span.addClass("next glyphicon glyphicon-chevron-right").html("");
				} else {
					span.html("<span class=dayNumber>" + d.getDate() + "</span>").css("width",w);
					if (d.getYear() == t.getYear() && d.getMonth() == t.getMonth() && d.getDate() == t.getDate())
						span.addClass("today");
					if (d.getYear() == calendar.currentDate.getYear() && d.getMonth() == calendar.currentDate.getMonth() && d.getDate() == calendar.currentDate.getDate())
						span.addClass("selected");
				}
				divDays.append(span);
			}
		}

		var deferredCallBack = function() {
			if (typeof(options.callback) == "function") {
				if (calendar.timer)
				clearTimeout(calendar.timer);
				
				calendar.timer = setTimeout(function() {
					options.callback(calendar);
				}, options.callbackDelay);
			}
		}
		fillYears(date);
		fillMonths(date);
		fillDays(date);
		deferredCallBack();
	}
	theDiv.click(function(ev) {
		var el = $(ev.target).closest(".calElement");
		if (el.hasClass("calElement")) {
			calendar.changeDate(new Date(parseInt(el.attr("millis"))));
		}
	});
	calendar.changeDate(options.date);
	return calendar;
};